load metallib not only as resource but in root of a bundle#2885
Conversation
|
I think we should hold onto this until we discuss on the mlx-swift side. I am concerned that this works around a build issue in the metal builder plugin -- perhaps we should just figure out how to get that to produce the correct path. See also ml-explore/mlx-swift#313 |
|
I would appreciate to get this implemented. It has no negative side effects and the code after my comment could be kept, even though I wonder, if this is a leftover of an older code basis. |
Upstream-проверка mlx-swift (перед написанием своего fix'а): * mlx-swift 0.31.3 = latest, bump не поможет. * Issue #349 (открыт фев'26, ровно наша симптоматика): maintainer явно ответил «swiftpm has no mechanism to build the metal shaders ... using xcodebuild (or CMake) is a workaround». Официального SwiftPM-fix'а не будет. * Issue #345 (открыт янв'26): без решения. * PR #313 «MetalCompilerPlugin support» — community-PR, CONFLICTING + REVIEW_REQUIRED, без review 5 месяцев, зависит от ml-explore/mlx#2885. Не путь. * Из комментариев #349 — community workaround через SwiftPM BuildToolPlugin + локальный copy-metallib скрипт. Это совпадает с Path 1 в нашем ADR 0013. → ADR 0013 пополнен секцией «Upstream state», с явным выводом, что fix решать локально. README + README.ru — known-issue notice в шапке (рядом со «Status»):⚠️ Known issue (2026-05-07): MLX inference сломан в release-сборке через `swift build` (нет default.metallib). Substrate работает. См. ADR-0013 / mlx-swift#349 / PR #30. Это для читателя, который найдёт Froggy сегодня и попытается использовать — упрётся в эту же стену. Honest-flag, не secret. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ADR 0013 + cycles tooling: validation gate поймал metallib-регрессию
Попытка захватить model-loaded snapshot (5 циклов load/unload через
IPC по плану «после Mem-3 контракт: worker_rss_kb=null после unload»)
показала: MLX worker умирает на первой реальной операции с
MLX error: Failed to load the default metallib. library not found
library not found library not found library not found
at .build/checkouts/mlx-swift/Source/Cmlx/mlx-c/mlx/c/memory.cpp:78
Проверка: `find .build -name "*.metallib"` — пусто. `swift build`
не компилирует Metal-shader'ы в `default.metallib` (это Xcode-only build
phase), и Cmlx target в mlx-swift Package.swift не объявляет .metal
файлы как resources. SwiftPM-bundle создаётся, но без metallib внутри.
Регрессия не ловилась раньше потому что MLXSupervisorIntegrationTests
используют `FroggyMLXWorkerFake` — Swift bin без `import MLX`.
Real-model loading никогда не запускался end-to-end. Validation gate
ADR 0011 ровно тут и поймал, до того как пошли в AD-1 строить
frontmost-veto на сломанной основе.
Не пытаюсь чинить в составе bench'а (per user plan: «отдельный issue/PR»).
Что вошло в этот PR:
- ADR 0013 — honest-doc регрессии: что ищется, в каком порядке, почему
не находится, 4 возможных пути фикса (pre-build script + SwiftPM
resources / параллельный xcodebuild target / binary XCFramework /
собирать через xcodebuild в .app). Решение откладывается до пост-сессии.
- bench/cycles_test.sh — orchestrator для 5-цикловой gate-проверки
(loadModel × N → bench → unloadModel → bench, проверка worker_rss_kb=null
+ daemon RSS не растёт). Сейчас не работает из-за metallib, оставлен
для использования после фикса.
- bench/run.sh — мелкий фикс: scenario auto-detection искал
`*modelLoaded*yes*` (camelCase) вместо реального `model_loaded yes`
(snake_case в froggy status output). Без фикса model-loaded snapshot
всегда тэгался idle/under-pressure.
- TODO.md — секция «Metallib regression (БЛОКЕР AD-1)» с явной
блокировкой Уровня 1.5 до фикса.
Substrate жив, изоляция Mem-3 работает — daemon не падает когда worker
не может загрузиться. Просто Уровень 1.5 на паузе.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* README/ADR-0013: known-issue notice + upstream-проверка
Upstream-проверка mlx-swift (перед написанием своего fix'а):
* mlx-swift 0.31.3 = latest, bump не поможет.
* Issue #349 (открыт фев'26, ровно наша симптоматика): maintainer
явно ответил «swiftpm has no mechanism to build the metal shaders ...
using xcodebuild (or CMake) is a workaround». Официального
SwiftPM-fix'а не будет.
* Issue #345 (открыт янв'26): без решения.
* PR #313 «MetalCompilerPlugin support» — community-PR, CONFLICTING +
REVIEW_REQUIRED, без review 5 месяцев, зависит от ml-explore/mlx#2885.
Не путь.
* Из комментариев #349 — community workaround через SwiftPM
BuildToolPlugin + локальный copy-metallib скрипт. Это совпадает с
Path 1 в нашем ADR 0013.
→ ADR 0013 пополнен секцией «Upstream state», с явным выводом, что
fix решать локально.
README + README.ru — known-issue notice в шапке (рядом со «Status»):
⚠️ Known issue (2026-05-07): MLX inference сломан в release-сборке
через `swift build` (нет default.metallib). Substrate работает.
См. ADR-0013 / mlx-swift#349 / PR #30.
Это для читателя, который найдёт Froggy сегодня и попытается
использовать — упрётся в эту же стену. Honest-flag, не secret.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Yaroslav <yaroslav@JabBook-Air-m3.local>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* ADR 0013 + cycles tooling: validation gate поймал metallib-регрессию
Попытка захватить model-loaded snapshot (5 циклов load/unload через
IPC по плану «после Mem-3 контракт: worker_rss_kb=null после unload»)
показала: MLX worker умирает на первой реальной операции с
MLX error: Failed to load the default metallib. library not found
library not found library not found library not found
at .build/checkouts/mlx-swift/Source/Cmlx/mlx-c/mlx/c/memory.cpp:78
Проверка: `find .build -name "*.metallib"` — пусто. `swift build`
не компилирует Metal-shader'ы в `default.metallib` (это Xcode-only build
phase), и Cmlx target в mlx-swift Package.swift не объявляет .metal
файлы как resources. SwiftPM-bundle создаётся, но без metallib внутри.
Регрессия не ловилась раньше потому что MLXSupervisorIntegrationTests
используют `FroggyMLXWorkerFake` — Swift bin без `import MLX`.
Real-model loading никогда не запускался end-to-end. Validation gate
ADR 0011 ровно тут и поймал, до того как пошли в AD-1 строить
frontmost-veto на сломанной основе.
Не пытаюсь чинить в составе bench'а (per user plan: «отдельный issue/PR»).
Что вошло в этот PR:
- ADR 0013 — honest-doc регрессии: что ищется, в каком порядке, почему
не находится, 4 возможных пути фикса (pre-build script + SwiftPM
resources / параллельный xcodebuild target / binary XCFramework /
собирать через xcodebuild в .app). Решение откладывается до пост-сессии.
- bench/cycles_test.sh — orchestrator для 5-цикловой gate-проверки
(loadModel × N → bench → unloadModel → bench, проверка worker_rss_kb=null
+ daemon RSS не растёт). Сейчас не работает из-за metallib, оставлен
для использования после фикса.
- bench/run.sh — мелкий фикс: scenario auto-detection искал
`*modelLoaded*yes*` (camelCase) вместо реального `model_loaded yes`
(snake_case в froggy status output). Без фикса model-loaded snapshot
всегда тэгался idle/under-pressure.
- TODO.md — секция «Metallib regression (БЛОКЕР AD-1)» с явной
блокировкой Уровня 1.5 до фикса.
Substrate жив, изоляция Mem-3 работает — daemon не падает когда worker
не может загрузиться. Просто Уровень 1.5 на паузе.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* README/ADR-0013: known-issue notice + upstream-проверка
Upstream-проверка mlx-swift (перед написанием своего fix'а):
* mlx-swift 0.31.3 = latest, bump не поможет.
* Issue #349 (открыт фев'26, ровно наша симптоматика): maintainer
явно ответил «swiftpm has no mechanism to build the metal shaders ...
using xcodebuild (or CMake) is a workaround». Официального
SwiftPM-fix'а не будет.
* Issue #345 (открыт янв'26): без решения.
* PR #313 «MetalCompilerPlugin support» — community-PR, CONFLICTING +
REVIEW_REQUIRED, без review 5 месяцев, зависит от ml-explore/mlx#2885.
Не путь.
* Из комментариев #349 — community workaround через SwiftPM
BuildToolPlugin + локальный copy-metallib скрипт. Это совпадает с
Path 1 в нашем ADR 0013.
→ ADR 0013 пополнен секцией «Upstream state», с явным выводом, что
fix решать локально.
README + README.ru — known-issue notice в шапке (рядом со «Status»):
⚠️ Known issue (2026-05-07): MLX inference сломан в release-сборке
через `swift build` (нет default.metallib). Substrate работает.
См. ADR-0013 / mlx-swift#349 / PR #30.
Это для читателя, который найдёт Froggy сегодня и попытается
использовать — упрётся в эту же стену. Honest-flag, не secret.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Yaroslav <yaroslav@JabBook-Air-m3.local>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
At the moment I prefer adding an API to set the path to metallib directly, i.e. #3597, and I plan to close this PR, please let me know if the API would not be able to solve your use case. |
|
See comment from #3562:
|
Proposed changes
This is in relation to mlx-swift. MetalCompilerPlugin does not generate a resource, but stores the lib in the bundle root. This patch adds bundle root to the search locations for the default.metallib.
Checklist
Put an
xin the boxes that apply.pre-commit run --all-filesto format my code / installed pre-commit prior to committing changes